#include <iostream>
using namespace std;
#include <string>

// 函数重载
// 函数重载的三种方式
//    1,函数参数个数的不同
//    2,函数参数的类型不同
//    3,函数参数的顺序不同
//     4,const修饰的也可以构成重载
//   函数的返回值 并不能实现函数重载.


class Point
{
public:
    // 无参构造
    Point()
    {
    }
    // 有参构造
    Point(int x, int y) : m_x(x), m_y(y)
    {
    }

public:
    void setX(int x);
    void setY(int y);

    int getX();
    int getY();

public:
    Point operator+(const Point &p1); // 重载加号运算符
    Point operator-(const Point &p2); // 重载减号运算符

private:
    int m_x;
    int m_y;
};

void Point::setX(int x)
{
    m_x = x;
}
void Point::setY(int y)
{
    m_y = y;
}

int Point::getX()
{
    return m_x;
}
int Point::getY()
{
    return this->m_y;
}

Point Point::operator+(const Point &p1)
{
    /*当类中只存在有参构造的时候，必须显式调用有参构造。*/
    Point res;
    res.m_x = m_x + p1.m_x;
    res.m_y = m_y + p1.m_y;

    return res;
}

Point Point::operator-(const Point &p2)
{
    Point res;
    res.m_x = m_x - p2.m_x;
    res.m_y = m_y - p2.m_y;

    return res;
}

int main()
{
#if 1 // 初始化
    string str1("hello word");
    string str2 = "hello class";

    cout << "str1:" << str1 << endl;
    cout << "str2:" << str2 << endl;

    string str3 = str1 + str2;
    cout << "str3:" << str3 << endl;

    str1.append("shopping."); //+=
    cout << str1 << endl;

    str1.assign("271."); // 赋值
    cout << str1 << endl;

    cout << str1.at(1) << endl; // 取第几个位置的元素.
    cout<< str1[1]<< endl;      // 取第几个位置的元素.

    cout <<str1.c_str()<<endl;  //C++字符串string 使用c_str()转换成c语言的字符串.

    cout<<str1.length()<<endl;  //字符串的长度
    cout <<"capacity:"<<str1.capacity()<<endl;


      
#endif

#if 0 // 加和减的运算符重载
    /*对象的地址和this指针的地址是一样的.*/
    Point p1(3, 4);
    cout << "X:" << p1.getX() << ",y:" << p1.getY() << endl;

    Point p2(5, 6);
    cout << "X:" << p2.getX() << ",y:" << p2.getY() << endl;

    Point p3 = p1 + p2;
    cout << "X:" << p3.getX() << ",y:" << p3.getY() << endl;

    Point p4 = p1 - p2;
    cout << "X:" << p4.getX() << ",y:" << p4.getY() << endl;
#endif

    return 0;
}
